package com.ruoyi.demo.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.helper.LoginHelper;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <简述>
 * <详细描述>
 *
 * @author syf
 * @date 2024年05月07日 10:58
 */
@SaIgnore
@RestController
@RequestMapping("cache")
public class TestSpringCacheController {

    /**
     * <简述>cacheNames： 指定名称 可以是数组
     *        key： 支持spel表达式，可以获取参数
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @param pageQuery
     * @return java.lang.String
     */
    @Cacheable(cacheNames = "cache1", key = "#id + '_cache' + #pageQuery.pageNum")
    @GetMapping("test1")
    public  String test1(String id, PageQuery pageQuery){

        return "ok";
    }

    /**
     * <简述> condition :符合条件进行缓存
     *        #id != null ：表示传入 id不为空才会缓存进入redis，id为空则不缓存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @Cacheable(cacheNames = "cache2", key = "#id + '_cache'" , condition = "#id != null")
    @GetMapping("test2")
    public  String test2(String id){

        return "ok";
    }

    /**
     * <简述> unless 符合条件不缓存
     *        #result == null ：接口返回结果为空则不进行缓存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @Cacheable(cacheNames = "cache3", key = "#id + '_cache'" , unless = "#result == null")
    @GetMapping("test3")
    public  String test3(String id){
        return null;
    }

    /**
     * <简述> sync = true
     *       同步阻塞：同时进来多个请求， 等待前面调用返回并缓存，才能回进入下个请求
     *       作用：防止缓存积存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @Cacheable(cacheNames = "cache4", key = "#id + '_cache'", sync = true)
    @GetMapping("test4")
    public  String test4(String id){
        return null;
    }

    /**
     * <简述> 获取类中参数
     *         比较繁琐，一般是在实现类中传递登录参数，用spel获取
     * @author syf
     * @date 2024/5/7 11:03
     * @return java.lang.String
     */
    @Cacheable(cacheNames = "cache5", key = "T(com.ruoyi.common.helper.LoginHelper).getLoginUser().getLoginId()")
    @GetMapping("test5")
    public  String test5(){
        LoginUser loginUser = LoginHelper.getLoginUser();
        return "ok";
    }

    /**
     * <简述> 更新缓存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @CachePut(cacheNames = "cache4", key = "#id + '_cache'")
    @GetMapping("test6")
    public  String test6(String id){
        return null;
    }

    /**
     * <简述> 删除缓存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @CacheEvict(cacheNames = "cache4", key = "#id + '_cache'")
    @GetMapping("test7")
    public  String test7(String id){
        return null;
    }

    /**
     * <简述> 删除所有缓存
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @CacheEvict(cacheNames = "cache4", allEntries = true)
    @GetMapping("test8")
    public  String test8(String id){
        return null;
    }

    /**
     * <简述> beforeInvocation 无论是否有异常都执行操作
     * @author syf
     * @date 2024/5/7 11:03
     * @param id
     * @return java.lang.String
     */
    @CacheEvict(cacheNames = "cache4", beforeInvocation = true)
    @GetMapping("test9")
    public  String test9(String id){
        return null;
    }

}
